import time
from ipymol import viewer
from ipymol import MolViewer
from typing import Any, Literal


def restart_pymol(app: int = 4,
                  quiet: Literal['q', 'Q', ''] = 'q',run:str='',**kwargs) -> MolViewer:
    '''重启远程pymol窗口
    
    Params
    ======
    - application: pymol视窗样式,使用pymol --help查看
    - quiet:'q'取消启动消息;'Q'禁用全部消息;''不禁用
    - run:运行其他py或pml文件,多个脚本文件用空格分开
    - kwargs:pymol --help支持的其他选项和值,没有值的用None占位

    Returns
    =======
    viewer: 模块中的单例对象
    '''

    def parse_value(value:Any) -> Any:
        '''处理值,让pymol可以正确接受'''
        if isinstance(value,str) and ' ' in value:
            value=f'"{value}"' # 双引号包围包含空格的值,通常是文件名
        elif value is None:
            value='' # 给没有值的选项占位
        return value

    kwargs=(f'-{key} {parse_value(value)}' for key,value in kwargs.items())

    viewer.stop()
    while viewer._process_is_running():
        time.sleep(1)
    viewer.start([f'-A{app}{quiet} {" ".join(kwargs)}'])
    for run_py in run.split():
        viewer.run(run_py)

    # 强制使用pymol色彩空间,适合网页显示
    viewer.space('pymol')
    viewer.bg_color('black')
    return viewer